package com.lmf.annotation;

import com.lmf.annotation.bean.Car;
import com.lmf.annotation.bean.Dog;
import com.lmf.annotation.bean.MyBeanPostProcessor;
import com.lmf.annotation.bean.Pig;
import com.lmf.annotation.config.MyConfigOfLifeCycle;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class IOCTest_BeanLifeCycle {

    /**
     * 测试 自定义管理bean的生命周期 方式一：使用的初始化，销毁方法
     */
    //测试单实例模式
    @Test
    public void test_1(){
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfigOfLifeCycle.class);
        Car car = context.getBean("car", Car.class);
        Car car2 = context.getBean("car", Car.class);
        System.out.println(car==car2);
        //关闭容器时，销毁bean
        context.close();
    }
    //测试多实例模式
    @Test
    public void test_2(){
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfigOfLifeCycle.class);
        Car car = context.getBean("car", Car.class);
        //关闭容器时，销毁bean
        context.close();
    }

    /**
     * 测试 自定义管理bean的生命周期 方式二：重写两个类的初始化，销毁方法，默认对象单实例
     */
    @Test
    public void test_3(){
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfigOfLifeCycle.class);
        Dog dog = context.getBean("dog", Dog.class);
        //关闭容器时，销毁bean
        context.close();
    }
    /**
     * 测试 自定义管理bean的生命周期 方式三：使用 @PostConstruct，@PreDestroy注解
     */
    @Test
    public void test_4(){
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfigOfLifeCycle.class);
        Pig pig = context.getBean("pig", Pig.class);
        //关闭容器时，销毁bean
        context.close();
    }
    /**
     * 测试 自定义管理bean的生命周期 方式四：实现BeanPostProcessor后置处理器实例，重写初始化方法前后调用的两个方法；
     *      任何类创建的时候，都会调用这两个方法
     */
    @Test
    public void test_5(){
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfigOfLifeCycle.class);
        //MyBeanPostProcessor myBeanPostProcessor = context.getBean("myBeanPostProcessor", MyBeanPostProcessor.class);
        //关闭容器时，销毁bean
        context.close();
    }
}
